#include<bits/stdc++.h>
using namespace std;
#define ll long long

int main(){
  int len,n;
  cin>>len>>n;
  vector<pair<int,int>> cube(n);
  for(int i=0;i<n;i++){
    cin>>cube[i].first>>cube[i].second;
  }
  int res=0;
  for(int i=1;i<=len;i++){
    int Min=INT_MAX;
    for(int j=0;j<n;j++){
      int temp=abs(i-cube[j].first);
      Min=min(Min,temp+cube[j].second);
    }
    res=max(res,Min);
  }
  cout<<res<<endl;

  return 0;
}

//#include<bits/stdc++.h>  // 包含几乎所有标准库的头文件，方便编程，但在正式项目中不建议使用，建议按需包含头文件
//using namespace std;    // 使用标准命名空间，这样可以直接使用标准库中的类和函数，无需加std::前缀
//#define ll long long    // 定义宏，将ll作为long long的别名，方便后续使用长整型
//
//int main(){
//  int len,n;  // 定义两个整型变量，len用于存储某个长度，n用于存储立方体的数量
//  cin>>len>>n;  // 从标准输入读取两个整数，分别赋值给len和n
//  vector<pair<int,int>> cube(n);  // 定义一个存储pair<int, int>类型元素的向量cube，初始大小为n，每个pair可以用来存储立方体的某个位置和某个代价
//  for(int i=0;i<n;i++){  // 循环n次，用于输入每个立方体的信息
//    cin>>cube[i].first>>cube[i].second;  // 从标准输入读取两个整数，分别赋值给第i个pair的第一个元素（位置）和第二个元素（代价）
//  }
//  int res=0;  // 定义一个整型变量res，用于存储最终结果，初始化为0
//  for(int i=1;i<=len;i++){  // 从1到len进行循环，模拟遍历某个范围
//    int Min=INT_MAX;  // 定义一个整型变量Min，初始化为整型的最大值，用于后续求最小值
//    for(int j=0;j<n;j++){  // 对每个立方体进行循环
//      int temp=abs(i-cube[j].first);  // 计算当前位置i与第j个立方体位置的绝对差值
//      Min=min(Min,temp+cube[j].second);  // 取Min和temp加上第j个立方体代价的最小值，更新Min
//    }
//    res=max(res,Min);  // 取res和Min的最大值，更新res
//  }
//  cout<<res<<endl;  // 将最终结果res输出到标准输出，并换行
//
//  return 0;  // 主函数正常结束，返回0
//}




//题目：管道
//
//描述：
//有一根长度为len的横向管道，按单位长度分为len段。每一段的中央都有一个可开关的阀门和一个检测水流的传感器。一开始管道是空的，位于Li的阀门会在Si时刻打开，
// 并不断让水流入管道，并以恒定速度1流向管道的左右两侧。对于位于Li的阀门，它流入的水在Ti(Ti>=Si)时刻会使得Li -(Ti-Si) ~ Li +(Ti-Si)区间的管
// 道的传感器检测到水流。求管道的每一个传感器都能检测到水流的最早时间。
//输入格式
//第一行，两个整数len和n，分别表示管道的段数和会打开的阀门数。
//接下来n行，每行两个数Li和Si，分别表示每个阀门的位置和打开时间。
//输出格式
//一个数，表示答案。
//输入样例
//10 5
//1 3
//3 2
//4 5
//7 1
//8 2
//输出样例